home *** CD-ROM | disk | FTP | other *** search
- // systrdlg.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "systray.h"
- #include "systrdlg.h"
- #include "aboutdlg.h"
- #include "devnotes.h"
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
-
- #define ID_MYSYSTRAYITEM 42
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CSystrayDlg dialog
-
- CSystrayDlg::CSystrayDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CSystrayDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CSystrayDlg)
- m_szBubbleText = _T("");
- m_bEnable = FALSE;
- m_nIconState = 0;
- m_bCycle = FALSE;
- m_bLoadOnStartup = FALSE;
- //}}AFX_DATA_INIT
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- m_uMyTimer = 0;
- }
-
- void CSystrayDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CSystrayDlg)
- DDX_Control(pDX, IDE_BUBBLETEXT, m_editBubbleText);
- DDX_Control(pDX, IDCK_ENABLE, m_ckEnable);
- DDX_Text(pDX, IDE_BUBBLETEXT, m_szBubbleText);
- DDV_MaxChars(pDX, m_szBubbleText, 63);
- DDX_Check(pDX, IDCK_ENABLE, m_bEnable);
- DDX_Radio(pDX, IDRB_ICONSTATE, m_nIconState);
- DDX_Check(pDX, IDCK_CYCLE, m_bCycle);
- DDX_Check(pDX, IDCK_LOADONSTARTUP, m_bLoadOnStartup);
- //}}AFX_DATA_MAP
- }
-
- BEGIN_MESSAGE_MAP(CSystrayDlg, CDialog)
- //{{AFX_MSG_MAP(CSystrayDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDABORT, OnHide)
- ON_BN_CLICKED(IDB_SET, OnSet)
- ON_BN_CLICKED(IDCK_ENABLE, OnEnable)
- ON_BN_CLICKED(IDRB_ICONSTATE, OnIconstate)
- ON_MESSAGE(WM_MYCALLBACK, OnMySystemTrayCallback)
- ON_BN_CLICKED(IDCK_CYCLE, OnCycle)
- ON_BN_CLICKED(IDB_CLEAR, OnClear)
- ON_WM_TIMER()
- ON_WM_CLOSE()
- ON_BN_CLICKED(IDB_ABOUT, OnAbout)
- ON_WM_QUERYENDSESSION()
- ON_BN_CLICKED(IDC_RADIO2, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO3, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO4, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO5, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO6, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO7, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO8, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO9, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO10, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO11, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO12, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO13, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO14, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO15, OnIconstate)
- ON_BN_CLICKED(IDC_RADIO16, OnIconstate)
- ON_BN_CLICKED(IDB_DEVNOTES, OnDevnotes)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CSystrayDlg message handlers
-
- BOOL CSystrayDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- CenterWindow();
-
- // Add "About..." menu item to system menu.
-
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
-
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
-
- // TODO: Add extra initialization here
-
- // Initialize the Win95SystemTray object.
- VERIFY(m_Win95SystemTray.Attach(m_hWnd));
- m_Win95SystemTray.RegisterCallbackMessage(WM_MYCALLBACK);
-
- m_editBubbleText.LimitText(63);
-
- // Process startup settings.
- if (m_bLoadOnStartup)
- {
- OnEnable();
-
- if (m_bCycle)
- {
- OnCycle();
- }
- }
-
- return TRUE; // return TRUE unless you set the focus to a control
- }
-
- void CSystrayDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
-
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
-
- void CSystrayDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
-
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
-
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
-
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
-
- HCURSOR CSystrayDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
-
- void CSystrayDlg::OnHide()
- {
- ShowWindow(SW_HIDE);
- }
-
- void CSystrayDlg::OnSet()
- {
- m_editBubbleText.GetWindowText(m_szBubbleText);
-
- // Set the bubble text.
- m_Win95SystemTray.ItemSetBubbleText(ID_MYSYSTRAYITEM, m_szBubbleText);
- }
-
- void CSystrayDlg::OnEnable()
- {
- if (UpdateData())
- {
- if (m_bEnable)
- {
- m_Win95SystemTray.ItemAdd(ID_MYSYSTRAYITEM);
- // no bubble text for now
- m_Win95SystemTray.ItemModify(ID_MYSYSTRAYITEM, m_hIcon, NULL);
- }
- else
- {
- m_Win95SystemTray.ItemDelete(ID_MYSYSTRAYITEM);
- }
-
- GetDlgItem(IDABORT)->EnableWindow(m_bEnable);
- }
- }
-
-
- void CSystrayDlg::OnIconstate()
- {
- if (UpdateData())
- {
- // Note: the bubble text gets reset every time the icon state
- // is changed in the system tray.
- HICON hNewIconToShowOnSystemTray =
- AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1 + m_nIconState));
- m_Win95SystemTray.ItemModify(ID_MYSYSTRAYITEM,
- hNewIconToShowOnSystemTray);
- }
- }
-
- LONG CSystrayDlg::OnMySystemTrayCallback(UINT wParam, LONG lParam)
- {
- switch (lParam)
- {
- case WM_LBUTTONDOWN:
- // Usually nothing, but maybe show a scaled down version of
- // the main window, like Volume Control does.
- break;
-
- case WM_LBUTTONDBLCLK:
- // Show the full application.
- ShowWindow(SW_SHOW);
- break;
-
- case WM_RBUTTONDOWN:
- // Create context popup menu.
- break;
-
- case WM_RBUTTONDBLCLK:
- // Usually nothing, but we'll change the icon state.
- m_nIconState = (m_nIconState + 1) % 16;
- CheckRadioButton(IDRB_ICONSTATE, IDC_RADIO16,
- IDRB_ICONSTATE + m_nIconState);
- OnIconstate();
- OnSet();
- break;
- }
-
- return(1);
- }
-
-
- void CSystrayDlg::OnCycle()
- {
- if (UpdateData())
- {
- if (m_bCycle)
- {
- // Start the timer.
- m_uMyTimer = SetTimer(ID_MYTIMER, 63, NULL); // about 1/4 second
- }
- else
- {
- // Kill the timer.
- m_uMyTimer = !KillTimer(ID_MYTIMER);
- }
- }
- }
-
- void CSystrayDlg::OnClear()
- {
- m_szBubbleText.Empty();
- m_editBubbleText.SetWindowText(m_szBubbleText);
-
- // Set the bubble text. No bubble will display.
- m_Win95SystemTray.ItemSetBubbleText(ID_MYSYSTRAYITEM, m_szBubbleText);
- }
-
- void CSystrayDlg::OnTimer(UINT nIDEvent)
- {
- if (nIDEvent == ID_MYTIMER)
- {
- OnMySystemTrayCallback(WM_MYCALLBACK, WM_RBUTTONDBLCLK);
- }
- else
- {
- CDialog::OnTimer(nIDEvent);
- }
- }
-
- void CSystrayDlg::OnClose()
- {
- if (m_uMyTimer)
- {
- m_uMyTimer = !KillTimer(ID_MYTIMER);
- }
-
- CDialog::OnClose();
- }
-
- void CSystrayDlg::OnAbout()
- {
- CAboutDlg dlg;
- dlg.DoModal();
- }
-
- void CSystrayDlg::OnCancel()
- {
- if (!UpdateData())
- {
- return;
- }
-
- AfxGetApp()->WriteProfileInt("CSysTray", "Load on Startup",
- m_bLoadOnStartup);
- AddToRunRegistryKey(m_bLoadOnStartup);
-
- CDialog::OnCancel();
- }
-
- BOOL CSystrayDlg::OnQueryEndSession()
- {
- if (!UpdateData() || !CDialog::OnQueryEndSession())
- return FALSE;
-
- // We want to see if we are marked to load on startup. If so, then we
- // want to make sure we put ourselves in the "Run" line of the registry,
- // so Windows will get us started again. This registry key is
- //
- // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
-
- if (m_bLoadOnStartup)
- {
- AfxGetApp()->WriteProfileInt("CSysTray", "Cycle Icon",
- m_bCycle);
- }
-
- if (ERROR_SUCCESS != AddToRunRegistryKey(m_bLoadOnStartup))
- {
- // Do something appropriate to handle this.
- }
-
- return TRUE;
- }
-
- LONG CSystrayDlg::AddToRunRegistryKey(BOOL bAdd)
- {
- HKEY hKey;
- LONG lRet;
-
- if (ERROR_SUCCESS == (lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0,
- KEY_WRITE, &hKey)))
- {
- if (bAdd)
- {
- CString sPath;
- char *p = sPath.GetBuffer(256);
-
- if (p != NULL)
- {
- ::GetModuleFileName(NULL, p, 255);
- sPath.ReleaseBuffer();
- lRet = RegSetValueEx(hKey, "CSysTray", 0, REG_SZ,
- (CONST BYTE *) (LPCSTR) sPath, sPath.GetLength() + 1);
- }
- else
- {
- lRet = 42; // Hmmmmmm.
- }
- }
- else
- {
- lRet = RegDeleteValue(hKey, "CSysTray");
- }
-
- RegCloseKey(hKey);
- }
-
- return(lRet);
- }
-
- void CSystrayDlg::OnDevnotes()
- {
- CDialogDevelNotes dlg;
- dlg.DoModal();
- }
-